<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> 
    <title> - 天地维杰网</title>
    <meta name="keywords" content="系统架构,shutdown,不与天斗,Domino,博客,程序员,架构师,笔记,技术,分享,java,Redis">
    
    <meta property="og:title" content="">
    <meta property="og:site_name" content="天地维杰网">
    <meta property="og:image" content="/img/author.jpg"> 
    <meta name="title" content=" - 天地维杰网" />
    <meta name="description" content="天地维杰网 | 博客 | 软件 | 架构 | Java "> 
    <link rel="shortcut icon" href="http://www.shutdown.cn/img/favicon.ico" />
    <link rel="apple-touch-icon" href="http://www.shutdown.cn/img/apple-touch-icon.png" />
    <link rel="apple-touch-icon-precomposed" href="http://www.shutdown.cn/img/apple-touch-icon.png" />
    <link href="http://www.shutdown.cn/js/vendor/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/js/vendor/fancybox/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/css/main.css" rel="stylesheet" type="text/css" />
    <link href="http://www.shutdown.cn/css/syntax.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Pisces',
    sidebar: {"position":"left","display":"post"},
     fancybox: true, 
    motion: true
  };
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7826003325059020" crossorigin="anonymous"></script>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">
<div class="container one-collumn sidebar-position-left page-home  ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"> <div class="site-meta  custom-logo ">

  <div class="custom-logo-site-title">
    <a href="http://www.shutdown.cn"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">天地维杰网</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">人如秋鸿来有信，事若春梦了无痕</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
    <ul id="menu" class="menu">
      
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />首页
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/redis/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-battery-full"></i> <br />Redis
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/java/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-coffee"></i> <br />java
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/linux/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-linux"></i> <br />linux
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/daily/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-bug"></i> <br />日常问题
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/spring/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-child"></i> <br />Spring和Springboot
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/mac/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-fire"></i> <br />Mac相关
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/middleware/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-gavel"></i> <br />中间件
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/jiagou/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-rocket"></i> <br />架构
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/python/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-ship"></i> <br />python
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/front/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-bolt"></i> <br />前端
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/jvm/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-balance-scale"></i> <br />jvm
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/categories/c/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-battery-empty"></i> <br />c语言
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/post/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />归档
          </a>
        </li>
      
        <li class="menu-item ">
          <a href="http://www.shutdown.cn/about/" rel="section">
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />关于
          </a>
        </li>
      
      <li class="menu-item menu-item-search">
        <a href="javascript:;" class="popup-trigger"> <i class="menu-item-icon fa fa-search fa-fw"></i> <br /> 搜索</a>
      </li>
    </ul>
    <div class="site-search">
      <div class="popup">
 <span class="search-icon fa fa-search"></span>
 <input type="text" id="local-search-input">
 <div id="local-search-result"></div>
 <span class="popup-btn-close">close</span>
</div>

    </div>
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
<section id="posts" class="posts-expand">
  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
    <header class="post-header">
      <h1 class="post-title" itemprop="name headline">
        <a class="post-title-link" href="http://www.shutdown.cn/post/redis4.0%E7%89%88%E6%9C%AC%E4%BB%8B%E7%BB%8D/" itemprop="url">
        
        </a>
      </h1>
      <div class="post-meta">
      <span class="post-time">
<span class="post-meta-item-icon">
    <i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">时间：</span>
<time itemprop="dateCreated" datetime="2016-03-22T13:04:35+08:00" content="0001-01-01">
    0001-01-01
</time>
</span> 
      
      
       <span>
&nbsp; | &nbsp;
<span class="post-meta-item-icon">
    <i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">阅读：</span>
<span class="leancloud-visitors-count">977 字 ~5分钟</span>
</span>
      </div>
    </header>
    <div class="post-body" itemprop="articleBody">
    

    

<p>So, what&rsquo;s new in Redis 4.0?</p>

<h2 id="major-features-主要特性">Major features (主要特性)</h2>

<ul>
<li><p>Redis modules system. Redis now allows developers to write modules that can extend the Redis functionalities and implement new data types. The module API implements a complete abstraction layer that separates the Redis core from the module implementation, allowing the same module to be loaded by different versions of Redis without modifications. See the modules documentation here for more info: <a href="https://github.com/antirez/redis/blob/unstable/src/modules/INTRO.md">https://github.com/antirez/redis/blob/unstable/src/modules/INTRO.md</a></p>

<blockquote>
<p>Redis模块系统。Redis现在允许开发者写模块，以扩展Redis功能和实现新数据类型。模块API实现了一个完整的抽象层，使得模块可以被不同版本的Redis加载。查看模块文档获取更多信息：<a href="https://github.com/antirez/redis/blob/unstable/src/modules/INTRO.md">https://github.com/antirez/redis/blob/unstable/src/modules/INTRO.md</a></p>
</blockquote></li>

<li><p>Partial Replication (PSYNC) version 2. The replication protocol was enhanced (in a backward compatible way, so that 4.0 can still act as a slave of older instances) in order to be able to partially resynchronize slaves and masters in conditions where it was impossible in the past: after a master switch because of a failover and when a slave instance is restared. Even masters turned into slaves will usually be able to partially resynchronize with the new master, if the new master was a former slave of the old master instance. The way the replication work for chained slaves (sub-slaves) is now very different, and each slave receives the same replication stream generated by the top-level master.</p>

<blockquote>
<p>局部复制（PSYNC）版本2。复制协议被增强（以一种可以向后兼容的方式，以便4.0可以作为旧版本的从属实例），以便在主从实例之间可以实现部分同步，而之前是主从切换或从实例重启后全量同步数据。即使主实例被切换为从属实例，新的主实例是旧的主实例的从属实例，通常仍然可以进行部分同步。主实例向关联的从属实例（及更下级从属实例）复制工作的实现方式现在非常不通，每个从实例接收的都是顶级主实例生成的相同的同步流。</p>
</blockquote></li>

<li><p>Cache eviction improvements. Redis 4.0 implements LFU (Least Frequently Used) as a new eviction algorithm, and improves the functionality, performances and precision of the existing algorithms. This blog post contains info about the changes: <a href="http://antirez.com/news/109">http://antirez.com/news/109</a></p>

<blockquote>
<p>缓存淘汰算法改进。Redis4.0实现了LFU(最少使用频次)算法作为新的淘汰算法，并且改进了现有算法的功能、性能和精度。本文档提供了更多信息：<a href="http://antirez.com/news/109">http://antirez.com/news/109</a></p>
</blockquote></li>

<li><p>Lazy freeing of keys. Redis is now able to delete keys in the background in a different thread without blocking the server. The new <code>UNLINK</code> command is the same as <code>DEL</code> but working in a non blocking way. Similarly an <code>ASYNC</code> option was added to <code>FLUSHALL</code> and <code>FLUSHDB</code> in order to let the entire dataset or a single database to be freed asynchronously.</p>

<blockquote>
<p>延迟释放键。Redis现在可以在后台在不阻塞服务器的情况下删除键。新的<code>UNLINK</code>命令是<code>DEL</code>命令的一个变体，它以非阻塞的方式工作。同样，<code>ASYNC</code>选项被添加到<code>FLUSHALL</code>和<code>FLUSHDB</code>中，以便整个数据集或单个数据库可以在后台异步释放。</p>
</blockquote></li>

<li><p>Mixed RDB-AOF format. If enabled the new format is used when rewriting the AOF file: the rewrite uses the more compact and faster to generate RDB format, and an AOF stream is appended to the file. This allows faster rewrites and reloads when using the AOF persistence.</p>

<blockquote>
<p>提供混合RDB-AOF持久化格式。如果启用，当重写AOF文件时，新格式被使用：重写使用更紧凑和更快速生成的RDB格式，并且将AOF流被附加到文件中。这使得AOF持久化时可以更快的重写和重新加载。</p>
</blockquote></li>

<li><p>A new MEMORY command, able to perform memory analysis of different kinds: troubleshooting of memory issues (with MEMORY DOCTOR, similar to LATENCY DOCTOR), reporting of the amount of memory used by a single key, more in-depth reporting of Redis memory usage compared to what the INFO command offers.</p>

<blockquote>
<p>新增的MEMORY命令，能够执行不同类型的内存分析：内存问题调试（用MEMORY DOCTOR，类似于LATENCY DOCTOR），单个键的内存使用量的报告，与与INFO命令提供的内存使用量相比更详细的报告Redis内存使用量的报告。</p>
</blockquote></li>

<li><p>Redis Cluster support for NAT / Docker. There are new functionalities in order to force cluster instances to announce specific sets of IP address, client and bus ports, to the rest of the cluster, regardless of the auto detected IP. This required a bus protocol change that will force users to mass-restart all the nodes of a Redis 3.2 installation in order to upgrade to 4.0.</p>

<blockquote>
<p>Redis Cluster 支持 NAT / Docker.提供了新的功能来强制集群实例公布特定的IP地址、客户端和总线端口，到集群中的其他节点，无论自动检测到的IP是什么。这需要一个总线协议改变，需要强制用户将其安装的Redis 3.2的所有节点都批量重启，才能升级到4.0。</p>
</blockquote></li>

<li><p>Redis uses now less memory in order to store the same amount of data. The gain depends a lot on the kind of dataset stored.</p>

<blockquote>
<p>Redis现在使用更少的内存来存储相同的数据量。这个收益得益于存储的数据集的种类。</p>
</blockquote></li>

<li><p>Redis is now able to defragment the used memory and reclaim space incrementally
while running. See the example <code>redis.conf</code> for more information.</p>

<blockquote>
<p>Redis现在可以在运行时逐步释放内存和重新整理内存。请参阅示例<code>redis.conf</code>以获取更多信息。</p>
</blockquote></li>
</ul>

<h2 id="smaller-features-较小的特性">Smaller features (较小的特性)</h2>

<ul>
<li><p>Improvements to the RDB format to support 64 bit lengths, binary sorted set scores, and more. The RDB file check utility now uses the same code base of the one used by Redis itself in order to load the RDB file in memory.</p>

<blockquote>
<p>改进了RDB的格式来支持64位的长度，二进制的有序集分数等等。RDB文件检查工具现在使用Redis本身使用的编码来加载RDB文件到内存。</p>
</blockquote></li>

<li><p>SWAPDB command: ability to completely and immediately (no latency) replace two Redis databases.</p>

<blockquote>
<p>SWAPDB命令：能够完全和立即（无延迟）替换同实例下的两个Redis数据库。</p>
</blockquote></li>

<li><p>Improvements to <code>dict.c</code>, the Redis hash table implementation.</p>

<blockquote>
<p><code>dict.c</code>的改进，改进Redis哈希表实现。</p>
</blockquote></li>

<li><p>Security improvements mapping POST and Host: commands to QUIT in order to prevent cross protocol scripting attacks.</p>

<blockquote>
<p>安全改进，映射<code>POST</code>和<code>Host：</code>命令到<code>QUIT</code>命令，以防止跨协议脚本攻击。</p>
</blockquote></li>

<li><p>RPUSHX and LPUSHX now accept a variable number of elements.
&gt; RPUSHX和LPUSHX现在可以接受元素数量的变量。</p></li>

<li><p>Reporting of additional memory used by copy on write in the INFO output.
&gt; 在INFO输出中报告 COW 使用的额外内存。</p></li>

<li><p>Serious refactoring of many core parts of Redis.
&gt; 重构Redis的许多核心部分。</p></li>
</ul>

<p>Redis 3.2 is mostly a strict subset of 4.0, you should not have any problem
upgrading your application from 3.2 to 4.0. However this is a list of small
non-backward compatible changes introduced in the 4.0 release:</p>

<blockquote>
<p>Redis 3.2基本是4.0的严格子集，从3.2升级到4.0基本没什么问题，但是这是4.0发布时增加的一些小的非后退兼容性的更改：</p>
</blockquote>

<ul>
<li>The Redis Cluster bus protocol of 4.0 is no longer compatible with Redis 3.2.
This was needed in order to provide Docker / NAT compatibility to Redis
Cluster. SO in order to upgrade a Redis Cluster to 4.0, a mass restart of
all the instances is needed.</li>
</ul>

<blockquote>
<ul>
<li>Redis Cluster 总线协议4.0不再兼容Redis 3.2。这是为了提供Docker / NAT兼容性到Redis集群。</li>
</ul>
</blockquote>

<ul>
<li>Redis Cluster CLUSTER NODES output is now slightly different. Nodes
addresses are now in the form host:port@bus-port instead of host:port.
Clients should use CLUSTER SLOTS in order to fetch the cluster configuration
however if they are still using CLUSTER NODES, they should be modified in
order to ignore the @bus-port part.</li>
</ul>

<blockquote>
<ul>
<li>Redis Cluster集群CLUSTER NODES输出现在有点不同。节点地址现在是host:port@bus-port格式，而不是host:port。
客户端应该使用CLUSTER SLOTS来获取集群配置，但是如果仍然使用CLUSTER NODES，它们应该修改，以忽略@bus-port部分。</li>
</ul>
</blockquote>

<ul>
<li>Writable slaves do not propagate writes to their sub-slaves, so writes to
writable slaves remain just local.</li>
</ul>

<blockquote>
<ul>
<li>可写的从属节点不会传播写入到他们的下级从属，所以可写的从属节点的写入仍然是本地的。</li>
</ul>
</blockquote>

<ul>
<li>The RDB format changed. Redis 4.0 is still able to read 3.2 (and all the
past versions) files, but not the other way around.</li>
</ul>

<blockquote>
<ul>
<li>RDB格式变了。Redis 4.0仍然可以读取3.2（和所有以前的版本）文件，但反过来不行。</li>
</ul>
</blockquote>

<ul>
<li>Certain log formats and sentences are different in Redis 4.0.</li>
</ul>

<blockquote>
<ul>
<li>Redis 4.0中的某些日志格式和句子有所变化。</li>
</ul>
</blockquote>

<ul>
<li>Certain INFO fields, especially related to replication, are now different.</li>
</ul>

<blockquote>
<ul>
<li>Redis 4.0中的某些INFO字段，特别是关于<code>replication</code>的相关字段有所变化。</li>
</ul>
</blockquote>

<ul>
<li>GEODIST, GEOPOS and GEOHASH return values changed for non existing keys:
Previously the return value was inconsistent between non existing key
and non existing elements. Now the return is always like if the key
contains no elements if the key does not exist. So, for instance,
&ldquo;GEOHASH non_existing_key A B C&rdquo; now returns an array of 3 NULL values
as it should. In general this change should not break compatibility with
the past since in the past two different forms were provided by the server
and the new behavior is one of the two.</li>
</ul>

<blockquote>
<ul>
<li>GEODIST，GEOPOS和GEOHASH对于不存在的键的返回值变了：
以前的key不存在和key存在元素不存在时返回值不一致。现在两种情况返回的值差不多。例如，&rdquo;GEOHASH non_existing_key A B C&rdquo;现在返回的是三个NULL的数组。通常这个改变不会影响以前的行为，因为以前有两种方式处理这个命令，而新的返回两种情况的处理方式是一种。</li>
</ul>
</blockquote>

<ul>
<li>The SLOWLOG command entires contain additional two fields: the client address
and name. This is documented in the SLOWLOG command online documentation.</li>
</ul>

<blockquote>
<ul>
<li><code>SLOWLOG</code>命令条目包含额外两个字段：客户端地址和名称。这是在线文档中提到的。</li>
</ul>
</blockquote>

    </div>
    <footer class="post-footer">
     

     <div class="post-nav">
    <div class="post-nav-next post-nav-item">
    
        <a href="http://www.shutdown.cn/post/redis4.0%E6%96%B0%E7%89%B9%E6%80%A7-%E5%86%85%E5%AD%98%E7%A2%8E%E7%89%87%E6%95%B4%E7%90%86/" rel="next" title="">
        <i class="fa fa-chevron-left"></i> 
        </a>
    
    </div>

    <div class="post-nav-prev post-nav-item">
    
        <a href="http://www.shutdown.cn/post/redis5.0%E4%BC%98%E5%8C%96-jemalloc5.1%E4%B8%80%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/" rel="prev" title="">
         <i class="fa fa-chevron-right"></i>
        </a>
    
    </div>
</div>
      
     
     
     






    </footer>
  </article>
</section>

          </div>
        </div>
        <div class="sidebar-toggle">
  <div class="sidebar-toggle-line-wrap">
    <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
  </div>
</div>
<aside id="sidebar" class="sidebar">
  <div class="sidebar-inner">

    <section class="site-overview sidebar-panel  sidebar-panel-active ">
      <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image"
        src="http://www.shutdown.cn/img/author.jpg"
        alt="不与天斗Domino" />
    <p class="site-author-name" itemprop="name">不与天斗Domino</p>
    <p class="site-description motion-element" itemprop="description"> 
        Programmer &amp; Architect</p>
</div>
      <nav class="site-state motion-element">
    <div class="site-state-item site-state-posts">
      <a href="http://www.shutdown.cn/post/">
        <span class="site-state-item-count">181</span>
        <span class="site-state-item-name">日志</span>
      </a>
    </div>
    <div class="site-state-item site-state-categories">    
        <a href="http://www.shutdown.cn/categories/">      
         
        <span class="site-state-item-count">14</span>
        
        <span class="site-state-item-name">分类</span>
        
        </a>
    </div>

    <div class="site-state-item site-state-tags">
        <a href="http://www.shutdown.cn/tags/">
         
        <span class="site-state-item-count">213</span>
        
        <span class="site-state-item-name">标签</span>
        </a>
    </div>
</nav>
      
      

      

      <div class="links-of-blogroll motion-element inline">
<script type="text/javascript" src="//rf.revolvermaps.com/0/0/8.js?i=&amp;m=0&amp;s=220&amp;c=ff0000&amp;cr1=ffffff&amp;f=arial&amp;l=33&amp;bv=35" async="async"></script>
</div>

    </section>
    
  </div>
</aside>

      </div>
    </main>
   
    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  <span itemprop="copyrightYear">  &copy; 
  2013 - 2023</span>
  <span class="with-love"><i class="fa fa-heart"></i></span>
  <span class="author" itemprop="copyrightHolder">天地维杰网</span>
  <span class="icp" itemprop="copyrightHolder"><a href="https://beian.miit.gov.cn/" target="_blank">京ICP备13019191号-1</a></span>
</div>
<div class="powered-by">
  Powered by - <a class="theme-link" href="http://gohugo.io" target="_blank" title="hugo" >Hugo v0.63.2</a>
</div>
<div class="theme-info">
  Theme by - <a class="theme-link" href="https://github.com/xtfly/hugo-theme-next" target="_blank"> NexT
  </a>
</div>


      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
      <span id="scrollpercent"><span>0</span>%</span>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/jquery/index.js?v=2.1.3"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/fastclick/lib/fastclick.min.js?v=1.0.6"></script> 
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/velocity/velocity.min.js?v=1.2.1"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/vendor/velocity/velocity.ui.min.js?v=1.2.1"></script>
<script src="http://www.shutdown.cn/js/vendor/ua-parser-js/dist/ua-parser.min.js?v=0.7.9"></script>

<script src="http://www.shutdown.cn/js/vendor/fancybox/jquery.fancybox.pack.js?v=2.1.5"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/utils.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/motion.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/affix.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/schemes/pisces.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/scrollspy.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/post-details.js"></script>
<script type="text/javascript" src="http://www.shutdown.cn/js/toc.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/bootstrap.js"></script>

<script type="text/javascript" src="http://www.shutdown.cn/js/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
      inlineMath: [ ['$','$'] ],
      displayMath: [ ['$$','$$'] ],
      processEscapes: true
    },
    "HTML-CSS": { fonts: ["TeX"] }
  });
</script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML' async></script>
</body>
</html>